//package com.itheima.ai.config;
//
//import co.elastic.clients.elasticsearch.ElasticsearchClient;
//import co.elastic.clients.elasticsearch.indices.CreateIndexRequest;
//import co.elastic.clients.elasticsearch.indices.ExistsRequest;
//import co.elastic.clients.json.jackson.JacksonJsonpMapper;
//import co.elastic.clients.transport.ElasticsearchTransport;
//import co.elastic.clients.transport.rest_client.RestClientTransport;
//import com.itheima.ai.utils.VectorDistanceUtils;
//import org.elasticsearch.client.RestClient;
//import org.springframework.ai.embedding.EmbeddingModel;
//import org.springframework.ai.reader.ExtractedTextFormatter;
//import org.springframework.ai.reader.pdf.PagePdfDocumentReader;
//import org.springframework.ai.reader.pdf.config.PdfDocumentReaderConfig;
//import org.springframework.ai.vectorstore.VectorStore;
//import org.springframework.ai.vectorstore.elasticsearch.ElasticsearchVectorStore;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.core.io.Resource;
//import org.springframework.core.io.ResourceLoader;
//
///**
// * 适配低版本Spring AI（如1.0.0-M4/M5）的配置类
// * 核心：ElasticsearchVectorStore.builder() 需传入 RestClient 和 EmbeddingModel
// */
//@Configuration
//public class AiFilesConfig {
//
//    // -------------------------- 1. 注入配置参数 --------------------------
//    // Ollama配置
//    @Value("${spring.ai.ollama.base-url}")
//    private String ollamaBaseUrl;
//    @Value("${spring.ai.ollama.embedding.model}")
//    private String ollamaEmbeddingModelName;
//
//    // Elasticsearch配置
//    @Value("${spring.ai.vectorstore.elasticsearch.uris}")
//    private String elasticsearchUri;
//    @Value("${spring.ai.vectorstore.elasticsearch.username:}")
//    private String elasticsearchUsername;
//    @Value("${spring.ai.vectorstore.elasticsearch.password:}")
//    private String elasticsearchPassword;
//
//    // PDF配置（从yaml注入完整文件路径）
//    @Value("${files.pdf.path}")
//    private String pdfFilePath;
//
//    private final int EMBEDDING_DIMENSIONS = 4096;
//    private static final String VECTOR_INDEX_NAME = "ai_document_index";
//
//    // -------------------------- 2. 配置EmbeddingModel（向量化模型） --------------------------
////    @Bean
////    public EmbeddingModel defaultEmbeddingModel(OllamaEmbeddingModel ollamaEmbeddingModel) {
////        return ollamaEmbeddingModel;
////    }
//
//
//    // -------------------------- 3. 配置PDF读取器 --------------------------
//    @Bean
//    public PagePdfDocumentReader pdfDocumentReader(ResourceLoader resourceLoader) {
//        // 加载classpath下的PDF文件（如 "pdf/中二知识笔记.pdf"）
//        Resource pdfResource = resourceLoader.getResource("classpath:" + pdfFilePath);
//        System.out.println("PDF文件路径：" + pdfFilePath);
//
//        // 校验文件是否存在，提前暴露错误
//        if (!pdfResource.exists()) {
//            throw new RuntimeException("PDF文件不存在！路径：classpath:" + pdfFilePath);
//        }
//        // PDF读取配置：每页拆分为1个Document
//        PdfDocumentReaderConfig pdfConfig = PdfDocumentReaderConfig.builder()
//                .withPagesPerDocument(1)
//                .withPageExtractedTextFormatter(ExtractedTextFormatter.defaults())
//                .build();
//
//        return new PagePdfDocumentReader(pdfResource, pdfConfig);
//    }
//
//
//    // -------------------------- 4. 修正：ElasticsearchVectorStore（有参builder） --------------------------
//    @Bean
//    public VectorStore elasticsearchVectorStore(@Qualifier("ollamaEmbeddingModel") EmbeddingModel embeddingModel) {
//        System.out.println("注入的嵌入模型类型：" + embeddingModel.getClass().getSimpleName()); // 应输出OllamaEmbeddingModel
//        // 步骤1：创建Elasticsearch RestClient（带认证）
//        RestClient esRestClient = createEsRestClient();
//        // 创建索引（如果不存在）
//
//        ElasticsearchTransport transport = new RestClientTransport(
//                esRestClient,
//                new JacksonJsonpMapper()
//        );
//        ElasticsearchClient elasticsearchClient = new ElasticsearchClient(transport);
//        createIndexIfNotExists(elasticsearchClient);
//
//        // 步骤2：关键修正：builder()传入 RestClient 和 EmbeddingModel（必填参数）
////        String vectorIndexName = "ai_document_index"; // 向量库索引名
//        return ElasticsearchVectorStore.builder(esRestClient, embeddingModel)
//                .build(); // 构建实例
//    }
//
//    // 辅助方法：创建Elasticsearch RestClient（处理认证）
//    private RestClient createEsRestClient() {
//        // 解析ES地址为HttpHost（如 http://localhost:9200 → HttpHost对象）
//        org.apache.http.HttpHost httpHost = org.apache.http.HttpHost.create(elasticsearchUri);
//
//        // 配置认证（若有用户名密码）
//        org.apache.http.client.CredentialsProvider credentialsProvider = new org.apache.http.impl.client.BasicCredentialsProvider();
//        if (!elasticsearchUsername.isEmpty() && !elasticsearchPassword.isEmpty()) {
//            credentialsProvider.setCredentials(
//                    org.apache.http.auth.AuthScope.ANY,
//                    new org.apache.http.auth.UsernamePasswordCredentials(elasticsearchUsername, elasticsearchPassword)
//            );
//        }
//
//
//        // 构建并返回RestClient
//        return RestClient.builder(httpHost)
//                .setHttpClientConfigCallback(httpClientBuilder ->
//                        httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)
//                )
//                .build();
//    }
//
//    /**
//     * 检查并创建索引（带正确的向量维度配置）
//     */
//    private void createIndexIfNotExists(ElasticsearchClient elasticsearchClient) {
//        try {
//            // 检查索引是否存在
//            boolean indexExists = elasticsearchClient.indices()
//                    .exists(ExistsRequest.of(e -> e.index(VECTOR_INDEX_NAME)))
//                    .value();
//
//            if (!indexExists) {
//                // 创建索引并配置映射
//                CreateIndexRequest request = CreateIndexRequest.of(c -> c
//                        .index(VECTOR_INDEX_NAME)
//                        .mappings(m -> m
//                                .properties("embedding", p -> p
//                                        .denseVector(dv -> dv
//                                                .dims(EMBEDDING_DIMENSIONS)
//                                                .index(true)
//                                                .similarity("cosine")
//                                        )
//                                )
//                                .properties("content", p -> p
//                                        .text(t -> t)
//                                )
//                                .properties("metadata", p -> p
//                                        .object(o -> o)
//                                )
//                        )
//                );
//
//                elasticsearchClient.indices().create(request);
//                System.out.println("已创建索引: " + VECTOR_INDEX_NAME + " (向量维度: " + EMBEDDING_DIMENSIONS + ")");
//            }
//        } catch (Exception e) {
//            throw new RuntimeException("创建Elasticsearch索引失败", e);
//        }
//    }
//
//
//    // -------------------------- 5. 向量距离工具Bean --------------------------
//    @Bean
//    public VectorDistanceUtils vectorDistanceUtils() {
//        return new VectorDistanceUtils();
//    }
//
//}